#include <iostream>
#include <spdlog/spdlog.h>
#include <spdlog/sinks/stdout_color_sinks.h>
#include <spdlog/sinks/basic_file_sink.h>
#include <spdlog/async.h>
#include <string>

std::shared_ptr<spdlog::logger> g_default_logger;

void init_logger(bool mode, const std::string& filename, int level)
{
    if(mode == 0)
    {
        // 标准输出
        g_default_logger = spdlog::stdout_color_mt("default_logger");

        //设置 刷新策略
        g_default_logger->set_level(spdlog::level::level_enum::trace);
        g_default_logger->flush_on(spdlog::level::level_enum::trace);
    }
    else
    {
        // 文件
        g_default_logger = spdlog::basic_logger_mt("file_logger", filename.c_str());
        g_default_logger->set_level((spdlog::level::level_enum)level);
        g_default_logger->flush_on((spdlog::level::level_enum)level);
    }

    g_default_logger->set_pattern("[%n][%H:%M:%S][%T][%-8l] %v ");
}

#define TRACE_LOG(format, ...) g_default_logger->trace(std::string("[{}:{}] ") + format, __FILE__, __LINE__, ##__VA_ARGS__);
#define DEBUG_LOG(format, ...) g_default_logger->debug(std::string("[{}:{}] ") + format, __FILE__, __LINE__, ##__VA_ARGS__);
#define INFO_LOG(format, ...) g_default_logger->info(std::string("[{}:{}] ") + format, __FILE__, __LINE__, ##__VA_ARGS__);
#define WARN_LOG(format, ...) g_default_logger->warn(std::string("[{}:{}] ") + format, __FILE__, __LINE__, ##__VA_ARGS__);
#define ERROR_LOG(format, ...) g_default_logger->error(std::string("[{}:{}] ") + format, __FILE__, __LINE__, ##__VA_ARGS__);
#define FATAL_LOG(format, ...) g_default_logger->fatal(std::string("[{}:{}] ") + format, __FILE__, __LINE__, ##__VA_ARGS__);
